package com.rjh.concurrent.monitor;

import lombok.extern.slf4j.Slf4j;

/**
 * 两个线程对初始值为 0 的静态变量一个做自增，一个做自减，各做 5000 次，结果是 0 吗？
 */
@Slf4j(topic = "c.CounterCase")
public class CounterCase {

    /**
     * 对于 i++ 而言（i 为静态变量），实际会产生如下的 JVM 字节码指令
     *
     * getstatic i // 获取静态变量i的值
     * iconst_1 // 准备常量1
     * iadd // 自增
     * putstatic i // 将修改后的值存入静态变量i
     */
    private static int counter = 0;

    private static final Object ROOM = new Object();

    public static void main(String[] args) throws InterruptedException {

        Thread t1 = new Thread(()->{
            for (int i=0;i<5000;i++){
                synchronized (ROOM){
                    counter++;
                }
            }
        },"t1");

        Thread t2 = new Thread(()->{
            for (int i=0;i<5000;i++){
                synchronized (ROOM) {
                    counter--;
                }
            }
        },"t2");

        t1.start();
        t2.start();

        t1.join();
        t2.join();
        log.debug("CounterCase ret:{}",counter);

    }
}
